package lua;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.*;

/**
 * @Author：作者姓名
 * @Package：lua
 * @Project：e-commerce-services
 * @name：LuaController
 * @Date：2024/7/15 18:44
 */
@RestController
public class LuaController {
    private static final String LUA_SCRIPT = "if tonumber(redis.call('exists',KEYS[1]))==0 then \n" +
            "   redis.call('set',KEYS[1],'10') \n" +
            "end \n" +
            "\n" +
            "if tonumber(redis.call('exists',KEYS[2]))==0 then \n" +
            "   redis.call('sadd',KEYS[2],'-1') \n" +
            "end \n" +
            "\n" +
            "if tonumber(redis.call('get',KEYS[1])) > 0 and tonumber(redis.call('sismember',KEYS[2],ARGV[2]))==0 then \n" +
            "   redis.call('incrby',KEYS[1],'-1') \n" +
            "   redis.call('sadd',KEYS[2],ARGV[2]) \n" +
            "   return 1 \n" +
            "else \n" +
            "   return 0 \n" +
            "end";
//    private static final String LUA_SCRIPT= """
//           if tonumber(redis.call('exists',KEYS[1]))==0 then
//                redis.call('set',KSY[1],'10')
//           end
//
//           if tonumber(redis.call('exists',KSYS[2]))==0 then
//                redis.call('sadd',KEYS[2],'-1')
//           end
//
//           if tonumber(redis.call('get',KEYS[1])) > 0 and tonumber(redis.call('sismember',KEYS[2],ARGV[2]))==0
//            redis.call('incrby',KEYS[1],'-1')
//            redis.call('sadd',KEYS[2],ARGV[2])
//            return 1
//           else
//            return 0
//            end
//          """;

    @Autowired
    private StringRedisTemplate redisTemplate;
    @GetMapping("/sk")
    public Map secKill(String pid){
        Map resp=new HashMap<>();
        String uid = String.valueOf(new Random().nextInt(1000000));
        List keys=new ArrayList<>();
        keys.add("P"+pid);
        keys.add("U"+pid);
        DefaultRedisScript<Long>redisScript=new DefaultRedisScript<>(LUA_SCRIPT, Long.class);
        Long result = redisTemplate.execute(redisScript, keys, "1010", uid);
        resp.put("uid",uid);
        resp.put("'result",result);
        return resp;
    }
}
